TECHNION ISRAEL INSTITUTE OF TECHNOLOGY DEPARTMENT OF COMPUTER SCIENCE הטכניון מכון טכנולוגי לישראל הפקולטה למדעי המחשב מרצה: אהוד ריבלין מבני נתונים 234218 1 מבחן מועד א' סמסטר אביב תשס"ו מתרגלים: איתן עזריאל, אמיר רובינשטיין, רומן סנדלר שם משפחה: שם פרטי: מס' סטודנט: משך המבחן: שלוש שעות. יש לענות על כל השאלות על טופס המבחן, במקומות המיועדים לכך. חובה להקפיד על ניסוח וכתב ברורים. תשובות לא קריאות כלל לא תיבדקנה. "לא 20% מהניקוד של שאלה או סעיף יינתנו אם התשובה היחידה בסעיף זה היא שימו לב: יודע/ת". מותר להשתמש בכל חומר עזר לא אלקטרוני. (חוברות התרגולים מותר להשתמש במשפטים ותוצאות המופיעים בחומר הרשמי של הקורס וההרצאות ופתרונות שפורסמו לתרגילי בית) ללא הסבר נוסף בתנאי שיצוין מפורשות באיזה משפט/תוצאה משתמשים. במבחן זה, סיבוכיות (זמן,זיכרון) מתייחסת תמיד למקרה הגרוע, אלא אם כן נאמר מפורשות אחרת. בטופס זה 10 עמודים ממוספרים, כולל דף זה. וודאו כי כולם ברשותכם. 34 15 20 15 16 100 ב ה צ ל ח ה! שאלה 1 שאלה 2 שאלה 3 שאלה 4 שאלה 5 סה"כ 1
שאלה (34 1 נקודות) שימו לב: בשאלה זו שלושה חלקים שאינם קשורים זה לזה. בכל הסעיפים אנו מתייחסים לערימת מינימום הממומשת כעץ כמעט שלם במערך, כפי שנלמד בכיתה. חלק (10 1 נקודות) בשני הסעיפים הבאים, ציינו האם הטענות הרשומות נכונות או לא, עבור ערימה כלשהי המכילה n מספרים שונים (הניחו כי k n= 2 1 עבור k 2 שלם). הוכיחו את תשובתכם. א. החציון של קבוצת המספרים יכול להיות משוכן בתא הראשון של המערך (שורש הערימה). הטענה / נכונה לא נכונה (הקיפו בעיגול) ב. החציון של קבוצת המספרים יכול להיות משוכן בכל אחד מתאי המערך, פרט לתא הראשון (השורש). הטענה / נכונה לא נכונה (הקיפו בעיגול) 2
חלק (14 2 נקודות) n עד 1. בכל כזכור, הפרוצדורה make_heap שנלמדה בהרצאות מבצעת siftdown לכל צומת מאינדקס 2 אחד משני הסעיפים הבאים הוצע שינוי לפרוצדורה. בכל סעיף עליכם לקבוע האם הפרוצדורה החדשה עובדת נכון (כלומר בסופה המערך מהווה ערימת מינימום חוקית), ולהוכיח את קביעתכם. בנוסף עליכם לציין מה סיבוכיות הפרוצדורה החדשה במונחים של Θ (תיטא), ולהסביר (יש להסביר חסם עליון ותחתון). א. בצע siftup לכל צומת, כאשר סדר המעבר על הצמתים הינו מאינדקס 1 עד n. (הפרוצדורה siftup(v) על צומת v מוגדרת כך: כל עוד v קטן מאביו ואינו השורש מחליפים בין v לאביו) הפרוצדורה נכונה לא נכונה (הקיפו בעיגול). / Θ( סיבוכיות הפרוצדורה היא: ) ב. בצע siftdown לכל צומת, כאשר סדר המעבר על הצמתים הינו מאינדקס 1 עד n. הפרוצדורה / נכונה לא נכונה (הקיפו בעיגול). Θ( סיבוכיות הפרוצדורה היא: ) 3
חלק (10 3 נקודות) נתון מערך בגודל n המהווה ערימת מינימום. תארו אלגוריתם להדפסת k האיברים הקטנים במערך בסדר ממוין מקטן לגדול, בסיבוכיות זמן של ) 2,O(k וסיבוכיות זיכרון נוסף (1)O. נתחו את סיבוכיות הזמן של האלגוריתם שתיארתם. שימו לב: מותר לשנות את סדר האיברים במערך במהלך פעולת האלגוריתם, אך בסיומו המערך חייב להוות ערימה חוקית. פתרונות שלא משנים את המערך בשום שלב של האלגוריתם יקבלו בונוס של 5 נקודות. תיאור האלגוריתם: ניתח סיבוכיות הזמן של האלגוריתם: 4
שאלה (15 2 נקודות) נתונה מחסנית, שתומכת בפעולות הבאות על מספרים בסיבוכיות זמן (1)O: InitStack אתחול מחסנית ריקה. Push(x) הכנסת האיבר בעל ערך x למבנה. Pop הוצאת האיבר האחרון שהוכנס למבנה. הפעולה מחזירה את ערכו של האיבר שהוצא. IsEmpty החזרת TRUE אם המחסנית ריקה, FALSE אחרת. עליכם להשתמש בשתי מחסניות כנ"ל כ"קופסא שחורה" כדי לממש תור, התומך בפעולות הבאות: InitQ אתחול תור ריק (פעולה זו נקראת פעם אחת בלבד, בהתחלה). EnQ(x) הכנסת האיבר בעל ערך x למבנה. DeQ הוצאת האיבר הוותיק ביותר מבין האיברים במבנה. סיבוכיות הזמן הדרושה עבור InitQ הינה (1)O, וסיבוכיות הזמן המשוערכת של EnQ ו DeQ צריכה להיות (1)O. רצות בזמן משוערך DeQ ו EnQ תארו את ביצוע הפעולות והוכיחו פורמלית כי הפעולות (1)O. תיאור ביצוע הפעולות: הוכחת סיבוכיות: 5
שאלה (20 3 נקודות) השאלה עוסקת בתחזוק ובפיצול של מלבנים במישור קואורדינטות פינתו הבאות: השמאלית התחתונה ופינתו הימנית העליונה. שצלעותיהם מקבילות לצירים. דרוש מלבן מיוצג ע"י מבנה נתונים למימוש הפעולות Init(a,b,c,d) אתחול מבנה נתונים ובו מלבן יחיד. צלעות המלבן מקבילות לצירים, ופינתו השמאלית תחתונה היא (a,b) ופינתו הימנית עליוונה היא.(c,d) Split_hor(a,b,c,d,y) פצל את המלבן שפינותיו הן (a,b) ו (c,d) (שמאלית תחתונה וימנית עליונה בהתאמה) לשני מלבנים ע"י הקטע האופקי המחבר את הנקודות (a,y) ו (c,y) (הניחו ש.(b<y<d אם אין מלבן כזה במבנה הפעולה נכשלת. לאחר הפיצול המלבן המקורי אינו קיים יותר. Split_ver(a,b,c,d,x) פצל את המלבן שפינותיו הן (a,b) ו (c,d) (שמאלית תחתונה וימנית עליונה בהתאמה) לשני מלבנים ע"י הקטע האנכי המחבר את הנקודות (x,b) ו (x,d) (הניחו ש.(a<x<c אם אין מלבן כזה במבנה הפעולה נכשלת. לאחר הפיצול המלבן המקורי אינו קיים יותר. x החזר כמה מלבנים יש במבנה בעלי פינה שמאלית תחתונה, שקואורדינטת ה Num_Rect_x(x 1 x, 2 ( שלה היא בין x 1 ל x 2 (כולל). y החזר כמה מלבנים יש במבנה בעלי פינה שמאלית תחתונה, שקואורדינטת ה Num_Rect_y(y 1 y, 2 ( שלה היא בין y 1 ל y 2 (כולל). Max_area() החזר את שטחו של המלבן בעל השטח המקסימלי מבין כל המלבנים שנמצאים כעת במבנה. דרישות סיבוכיות זמן: Init ו Max_area ב (1)O, ארבע הפעולות האחרות ב (n O(log כאשר n הוא מספר המלבנים שקיימים במבנה בעת ביצוע הפעולה. תחילה תארו מבנה נתונים התומך בפעולות הנ"ל בסיבוכיות הדרושה, פעולה. תאור מבנה הנתונים: ואח"כ הסבירו כיצד מתבצעת כל 6
הסבר על ביצוע הפעולות: 7
שאלה (15 4 נקודות) נתונה מחרוזת s מעל א"ב קבוע כלשהו. תארו אלגוריתם המדפיס מחרוזת t המקיימת את התכונה הבאה: t היא תתהמחרוזת הארוכה ביותר של s שמופיעה ב s יותר מפעם אחת. מבין כל תתהמחרוזות שמקיימות את התכונה הנ"ל, תודפס המחרוזת הקטנה ביותר לקסיקוגרפית. אם אין ל s תתמחרוזת שמופיעה ב s יותר מפעם אחת, האלגוריתם לא מדפיס כלום. המחרוזת s. לדוגמא: עבור המחרוזת s=ababcabcc האלגוריתם ידפיס.abc תיאור האלגוריתם: עבור המחרוזת s=ababa האלגוריתם ידפיס.aba על האלגוריתם לרוץ בזמן ( s )O, כאשר s הוא אורך 8
שאלה (16 5 נקודות) הדוק פיתרו את נוסחאות הנסיגה הבאות. בכל סעיף ציינו חסם עליון ותחתון הדוקים ככל שתוכלו (במונחים של O ו Ω), והוכיחו את תשובתכם. ניקוד חלקי יינתן למי שיגיע לחסמים שונים זה מזה, אך ניתן להגיע לחסם ) Θ ). הניחו כי = 1 (1) T. מותר להניח (לשם פשטות ההוכחה) כי n הינו חזקה שלמה של 2. n n. T ( n) = 2T + 2 log n א. T ( n) = O( ) T ( n) =Ω( ) 9
n n n n k, T ( n) = n+ T + T + T +... + T 2 4 8 2 עבור k קבוע כלשהו. ב. T ( n) = O( ) T ( n) =Ω( ) 10